<?php
/**
 * 百度LBS云
 * Created by PhpStorm.
 * User: ADKi
 * Date: 2016/8/26 0026
 * Time: 14:53
 * @author ADKi
 */
include_once('geotable.php');
include_once('poi.php');
include_once('column.php');
class lbsyun
{
    /*用户的访问权限key*/
    protected $ak = 'ef2c7cu4CcsIRasi1G7zBNlmAjwqBQbO';

    /*用户的权限签名*/
    protected $sn = '';

    /**
     * 新增Geo数据
     * @param $name string 表名
     * @return object
     * */
    public function createGeo($name)
    {
        $GeoTable = new geotable();
        $send_data = array(
            'name' => $name,
            'geotype' => 1, //1：点；2：线；3：面。默认为1（当前不支持“线”）
            'is_published' => 1, //自动发布到云检索
            'ak' => $this->ak,
        );
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $GeoTable->PostCreatedGeo($send_data);
    }

    /**
     * 查询全部Geo表 或者根据 $name 正则匹配
     * @param $name string 正则匹配的表名称
     * @return object
     * */
    public function listGeo($name = null)
    {
        $GeoTable = new geotable();
        $send_data['ak'] = $this->ak;
        if ($name != null) {
            $send_data['name'] = $name;
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $GeoTable->GetList($send_data);
    }

    /**
     * 查询Geo指定id表
     * @param $id int 指定geotable的id
     * @return object
     * */
    public function detailGeo ($id = null)
    {
        $GeoTable = new geotable();
        $send_data['ak'] = $this->ak;
        if ($id != null) {
            $send_data['id'] = $id;
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $GeoTable->GetDetail($send_data);
    }

    /**
     * 修改Geo表根据 id 和name
     * @param $id int geotable主键
     * @param $is_published int 是否发布到检索	,会引起批量操作
     * @param $name string geotable的中文名称（可选）
     * @return object
     * */
    public function updateGeo($id, $is_published = true, $name = null)
    {
        $GeoTable = new geotable();
        $send_data['ak'] = $this->ak;
        $send_data['id'] = $id;
        $send_data['is_published'] = $is_published;
        if ($name != null) {
            $send_data['name'] = $name;
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $GeoTable->PostUpdate($send_data);
    }

    /**
     * 删除Geo表
     * @param $id int 删除的表id
     * @return object
     * */
    public function deleteGeo($id)
    {
        $GeoTable = new geotable();
        $send_data['ak'] = $this->ak;
        $send_data['id'] = $id;
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $GeoTable->PostDelete($send_data);
    }

    /**
     * 创建column数据列
     * @param $name string(45) column的属性中文名称
     * @param $key string(45) column存储的属性key,同一个geotable内的名字不能相同
     * @param $type int 存储的值的类型 枚举值1:Int64, 2:double, 3:string, 4:在线图片url
     * @param $max_length int 最大长度
     *      最大值2048，最小值为1。当type为string该字段有效，此时该字段必填。此值代表utf8的汉字个数，不是字节个数
     * @param $default_value string(45) 默认值
     * @param $is_sortfilter_field int 是否检索引擎的数值排序筛选字段
     *      1代表是，0代表否。设置后，在请求 LBS云检索时可针对该字段进行排序。该字段只能为int或double类型，最多设置15个
     * @param $is_search_field int 是否检索引擎的文本检索字段
     *      1代表支持，0为不支持。只有type为string时可以设置检索字段，只能用于字符串类型的列且最大长度不能超过512个字节
     * @param $is_index_field int 是否存储引擎的索引字段
     *      用于存储接口查询:1代表支持，0为不支持 注：is_index_field=1 时才能在根据该列属性值检索时检索到数据
     * @param $is_unique_field int 是否云存储唯一索引字段，方便更新，删除，查询
     *      1代表是，0代表否。设置后将在数据创建和更新时进行该字段唯一性检查，并可以以此字段为条件进行数据的更新、删除和查询。最多设置1个
     * @param $geotable_id string 所属于的geotable_id
     * @return object
     * */
    public function createCol($name, $key, $type, $max_length, $default_value,$is_sortfilter_field, $is_search_field, $is_index_field, $is_unique_field, $geotable_id)
    {
        $Column = new column();
        $send_data = array(
            'ak' => $this->ak,
            'name' => $name,
            'key' => $key,
            'type' => $type,
            'max_length' => $max_length,
            'default_value' => $default_value,
            'is_sortfilter_field' => $is_sortfilter_field,
            'is_search_field' => $is_search_field,
            'is_index_field' => $is_index_field,
            'is_unique_field' => $is_unique_field,
            'geotable_id' => $geotable_id
        );
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Column->PostCreate($send_data);
    }

    /**
     * 查询Col列
     * @param $name string geotable meta的属性中文名称
     * @param $key string geotable meta存储的属性key
     * @param $geotable_id string 所属于的geotable_id
     * @return object
     * */
    public function listCol($name = null, $key = null, $geotable_id)
    {
        $Column = new column();
        $send_data = array(
            'ak' => $this->ak,
            'geotable_id' => $geotable_id,
        );
        if (!is_null($name)) {
            $send_data['name'] = $name;
        }
        if (!is_null($key)) {
            $send_data['key'] = $key;
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Column->GetList($send_data);
    }

    /**
     * 查询Col指定id列
     * @param $id int 列的id
     * @param $geotable_id int 表的id
     * @return object
     * */
    public function detailCol($id, $geotable_id)
    {
        $Column = new column();
        $send_data = array(
            'ak' => $this->ak,
            'id' => $id,
            'geotable_id' => $geotable_id
        );
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Column->GetDetail($send_data);
    }

    /**
     * 更新column数据列
     * @param $id int 列主键
     * @param $geotable_id int 所属于的geotable_id
     * @param $name string(45) column的属性中文名称
     * @param $max_length int 最大长度
     *      最大值2048，最小值为1。当type为string该字段有效，此时该字段必填。此值代表utf8的汉字个数，不是字节个数
     * @param $default_value string(45) 默认值
     * @param $is_sortfilter_field int 是否检索引擎的数值排序筛选字段
     *      1代表是，0代表否。设置后，在请求 LBS云检索时可针对该字段进行排序。该字段只能为int或double类型，最多设置15个
     * @param $is_search_field int 是否检索引擎的文本检索字段
     *      1代表支持，0为不支持。只有type为string时可以设置检索字段，只能用于字符串类型的列且最大长度不能超过512个字节
     * @param $is_index_field int 是否存储引擎的索引字段
     *      用于存储接口查询:1代表支持，0为不支持 注：is_index_field=1 时才能在根据该列属性值检索时检索到数据
     * @param $is_unique_field int 是否云存储唯一索引字段，方便更新，删除，查询
     *      1代表是，0代表否。设置后将在数据创建和更新时进行该字段唯一性检查，并可以以此字段为条件进行数据的更新、删除和查询。最多设置1个
     * @return object
     * */
    public function updateCol($id, $geotable_id, $name = null, $default_value = null,$is_sortfilter_field = null, $is_search_field = null, $is_index_field = null, $is_unique_field = null)
    {
        $Column = new column();
        $send_data = array(
            'ak' => $this->ak,
            'id' => $id,
            'geotable_id' => $geotable_id,
        );
        if (!is_null($name)) {
            $send_data['name'] = $name;
        }
        if (!is_null($default_value)) {
            $send_data['default_value'] = $default_value;
        }
        if (!is_null($is_sortfilter_field)) {
            $send_data['is_sortfilter_field'] = $is_sortfilter_field;
        }
        if (!is_null($is_search_field)) {
            $send_data['is_search_field'] = $is_search_field;
        }
        if (!is_null($is_index_field)) {
        $send_data['is_index_field'] = $is_index_field;
        }
        if (!is_null($is_unique_field)) {
            $send_data['is_unique_field'] = $is_unique_field;
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Column->PostUpdate($send_data);
    }

    /**
     * 删除Col指定条件列
     * @param $id int 列的id
     * @param $geotable_id int 表的id
     * @return object
     * */
    public function deleteCol($id, $geotable_id)
    {
        $Column = new column();
        $send_data = array(
            'ak' => $this->ak,
            'id' => $id,
            'geotable_id' => $geotable_id
        );
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Column->GetDelete($send_data);
    }

    /**
     * 创建数据（create poi）接口
     * @param $title string poi名称
     * @param $address string 地址
     * @param $tags string tags
     * @param $latitude double 用户上传的纬度
     * @param $longitude double 用户上传的经度
     * @param $coord_type int 用户上传的坐标的类型
     *      1：GPS经纬度坐标
     *      2：国测局加密经纬度坐标
     *      3：百度加密经纬度坐标
     *      4：百度加密墨卡托坐标
     * @param $geotable_id string 记录关联的geotable的标识
     * @param $column_val array 用户在column定义的key/value对,唯一索引字段必选，且需要保证唯一，否则会创建失败
     * @return object
     * */
    public function createPoi($latitude, $longitude, $coord_type, $geotable_id, $title = null, $address = null, $tags = null, array $column_val = null)
    {
        $Poi = new poi();
        $send_data = array(
            'ak' => $this->ak,
            'latitude' => $latitude,
            'longitude' => $longitude,
            'coord_type' => $coord_type,
            'geotable_id' => $geotable_id,
        );
        if (!is_null($title)) {
            $send_data['title'] = $title;
        }
        if (!is_null($address)) {
            $send_data['address'] = $address;
        }
        if (!is_null($tags)) {
            $send_data['tags'] = $tags;
        }
        if (!is_null($column_val)) {
            foreach ($column_val as $key => $value) {
                $send_data[$key] = $value;
            }
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Poi->PostCreate($send_data);
    }

    /**
     * 查询指定条件的数据（poi）列表接口
     * @param $column_val array column需要设置了is_index_field=1。对于string，是前缀匹配，如需精确匹配请在末尾加$。
     *      对于int或者double，则是范围查找，传递的格式为最小值,最大值。当无最小值或者最大值时，用-代替，同时，此字段最大长度不超过50，
     *      最小值与最大值都是整数
     *      例：如加入一个命名为color数据类型为string的column，在检索是可设置为“color=red”的形式来检索color字段为red的POI
     * @param $geotable_id string geotable_id
     * @param $title string 记录（数据）名称
     * @param $tags string 记录的标签（用于检索筛选）
     * @param $bounds string 查询的矩形区域
     * @param $page_index int 分页索引
     * @param $page_size int 分页数目
     * @return object
     * */
    public function listPoi(array $column_val = null, $geotable_id, $title = null, $tags = null, $bounds = null, $page_index = 0, $page_size = 10)
    {
        $Poi = new poi();
        $send_data = array(
            'ak' => $this->ak,
            'geotable_id' => $geotable_id,
            'page_index' => $page_index,
            'page_size' => $page_size,
        );
        if (!is_null($title)) {
            $send_data['title'] = $title;
        }
        if (!is_null($bounds)) {
            $send_data['bounds'] = $bounds;
        }
        if (!is_null($tags)) {
            $send_data['tags'] = $tags;
        }
        if (!is_null($column_val)) {
            foreach ($column_val as $key => $value) {
                $send_data[$key] = $value;
            }
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Poi->GetList($send_data);
    }

    /**
     * 查询指定id的数据（poi）详情接口
     * @param $geotable_id int geotable_id
     * @param $id int poi主键
     * @return object
     * */
    public function detailPoi($id, $geotable_id)
    {
        $Poi = new poi();
        $send_data = array(
            'ak' => $this->ak,
            'geotable_id' => $geotable_id,
            'id' => $id,
        );
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Poi->GetDetail($send_data);
    }

    /**
     * 修改数据（poi）接口
     * @param $id int 当不存在唯一索引字段时必须，存在唯一索引字段可选
     * @param $key string 自定义唯一索引key,若自定义索引字段和id共存时，将以id为准，且自定义索引key将被新的value
     * @param $title string poi名称
     * @param $address string 地址
     * @param $tags string tags
     * @param $latitude double 用户上传的纬度
     * @param $longitude double 用户上传的经度
     * @param $coord_type int 用户上传的坐标的类型
     *      1．GPS经纬度坐标
     *      2．测局加密经纬度坐标
     *      3．百度加密经纬度坐标
     *      4．百度加密墨卡托坐标
     * @param $geotable_id string 记录关联的geotable的标识
     * @param $column_val array 用户在column定义的key/value对
     * @return object
     * */
    public function updatePoi($id = null, $geotable_id, $coord_type, $title = null, array $column_val = array(), $key = null, $address = null, $tags = null, $latitude = null, $longitude = null)
    {
        $Poi = new poi();
        $send_data = array(
            'ak' => $this->ak,
            'geotable_id' => $geotable_id,
            'coord_type' => $coord_type,
        );
        if (!is_null($id)) {
            $send_data['id'] = $id;
        }
        if (!is_null($key)) {
            $send_data['key'] = $key;
        }
        if (!is_null($title)) {
            $send_data['title'] = $title;
        }
        if (!is_null($address)) {
            $send_data['address'] = $address;
        }
        if (!is_null($tags)) {
            $send_data['tags'] = $tags;
        }
        if (!is_null($longitude)) {
            $send_data['longitude'] = $longitude;
            $send_data['latitude'] = $latitude;
        }
        if (!empty($column_val)) {
            foreach ($column_val as $key => $value) {
                $send_data[$key] = $value;
            }
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Poi->PostUpdate($send_data);
    }

    /**
     * 删除数据（poi）接口（支持批量）
     * @param $id int 被删除的id,如果设置了这个参数，其它的删除条件会被忽略，只会根据id删除单条poi。此时此操作不是批量请求。
     * @param $key string 自定义唯一索引key,若自定义索引字段和id共存时，优先选择根据id删除poi。
     * @param $ids id列表,最多1000个id, 如果设置了批量删除is_total_del = 1并且没有设置id字段，则优先根据ids删除多条poi, 其它条件将被忽略.
     * @param $index_key array 用户在column定义的key/value对, column需要设置了is_index_field=1。
     *      对于string，是前缀匹配，如需精确匹配请在末尾加$。对于int或者double，则是范围查找，
     *      传递的格式为：最小值,最大值。当无最小值或者最大值时，用-代替，
     *      同时，此字段最大长度不超过50，最小值与最大值都是整数.
     * @param $title string 名称
     * @param $tags string tags
     * @param $bounds string 查询的矩形区域,格式x1,y1;x2,y2分别代表矩形的左上角和右下角
     * @param $geotable_id string
     * @param $column_key array 用户在column定义的key/value对
     * @param $is_total_del int 标记为批量删除,如需删除一条以上数据，在设定数据范围的条件时，
     *      还需要将该字段设为1。 注意：若仅设为1，而不设定数据范围的条件（如不指定ids、tag等），则默认为删除全表数据
     * @return object
     * */
    public function deletePoi($id = null, $geotable_id, $key = null, $ids = null, array $index_key = array(), $title = null, $tags = null, $bounds = null, array $column_key = array(), $is_total_del = 0)
    {
        $Poi = new poi();
        $send_data = array(
            'ak' => $this->ak,
            'geotable_id' => $geotable_id,
            'is_total_del' => $is_total_del,
        );
        if (!is_null($id)) {
            $send_data['id'] = $id;
        }
        if (!is_null($key)) {
            $send_data['key'] = $key;
        }
        if (!is_null($title)) {
            $send_data['title'] = $title;
        }
        if (!is_null($ids)) {
            $send_data['ids'] = $ids;
        }
        if (!is_null($tags)) {
            $send_data['tags'] = $tags;
        }
        if (!is_null($bounds)) {
            $send_data['bounds'] = $bounds;
        }
        if (!empty($index_key)) {
            foreach ($index_key as $key => $value) {
                $send_data[$key] = $value;
            }
        }
        if (!empty($column_key)) {
            foreach ($column_key as $key => $value) {
                $send_data[$key] = $value;
            }
        }
        if ($this->sn != '') {
            $send_data['sn'] = $this->sn;
        }
        return $Poi->PostDelete($send_data);
    }
}